from django.shortcuts import render
from rest_framework import viewsets # 已经写好了增删改查的接口

from classes.serializer import ClassesSerializer # 序列化
from rest_framework.permissions import IsAuthenticated # 内置的登录权限

from classes.models import ClassesMixin  # 模型
from uitl.coustomPermissions import TeachPermissions # 自定义权限 只有老师的权限
from user.serializer import RegisUserSerializer # 导入注册的序列化器
from rest_framework.status import HTTP_404_NOT_FOUND  # 状态码
from rest_framework.response import Response # 返回
from django.contrib.auth.models import User  # 用户表
import string # 字符串模块
import random # 随机模块
from django.contrib.auth.models import Group # 导入用户组
from celery_takas.email.taske import send_email_task # 导入自己写的发送邮件的方法

# Create your views here.

class ClassesView(viewsets.ModelViewSet):  # 继承
    # 属性名称是固定的
    queryset = ClassesMixin.objects.filter(is_delete=False) # 查询符合的
    serializer_class = ClassesSerializer # 指定序列化  # 会自动的反与正的序列化
    # permission_classes = [IsAuthenticated]  # 使用内置的登录权限
    permission_classes = [TeachPermissions]  # 老师权限




class ClassesMemberViewSet(viewsets.ViewSet):
    serializer_class = RegisUserSerializer # 指定序列化器
    permission_classes = [TeachPermissions]  # 权限 只有老师的权限

    # 注册的时候判断是否是新成员是则添加
    def add_member(self,request,pk):
        '''
        1.获取指定的班级
        2.判断成员是否已经属于该班级，属于:则提示该成员已经加入了该班级,代码结束
        3.不属于，判断成员是否注册,已经注册,添加到班级,代码结束
        4没有注册，注册用户,生成初始密码
        5.新账号放到学生组并且添加到班级
        6.通过邮件将账号与初始密码发送给学生的邮箱

        :param request:
        :param pk:  班级id
        :return:
        '''
        '''
        班级可能有可能没有，没有会报错所以要做异常处理
        '''
        # 1.获取指定的班级
        try:
            classes = ClassesMixin.objects.get(id=pk)  # 获取后端的班级
        except classes.DoesNotExist: # 不存在班级会报错,异常处理
            return Response(status=HTTP_404_NOT_FOUND)  # 出现异常返回状态码

        # 2.判断成员是否已经属于该班级，属于:则提示该成员已经加入了该班级,代码结束
        username = request.data['username']  # 获取前端的用户名

        member = classes.member.filter(username=username) # 查看班级表里面有没有该成员

        if member:
            # 该成员属于该班级
            return Response({'msg':'该成员存在该班级'})  # 返回提示信息 键名是固定的

        # 3.不属于，判断成员是否注册,已经注册,添加到班级,代码结束
        user = User.objects.filter(username=username)  # 在这个用户表里面,则表示已经注册了, 返回的是一个查询集列表
        if user:
            # 注册
            classes.member.add(user[0]) # 添加到班级

            return Response(ClassesSerializer(user[0]).data) # 返回已经添加到班级的序列化信息

        # 4.没有注册，注册用户,生成初始密码
        user_serializer = RegisUserSerializer(data=request.data)  # 反向序列化,把前端的数据序列化
        user_serializer.is_valid(raise_exception=True) # 校验 raise_exception为True的时候发生异常则抛出错误

        first_name = request.data['first_name'] # 姓名
        email = request.data['email'] # 邮箱

        # 5.保存数据 空实例化,指定字段
        user = User(username=username,first_name=first_name,email=email)

        # 生成初始化密码
        sou = string.ascii_letters + string.digits # 生成26个大小写的字母,与0-9的数字

        password = ''.join(random.sample(sou,6)) # 获取随机的密码

        user.set_password(password) # 保存加密后的密码

        user.save() # 保存数据

        # 新账号放到学生组并且添加到班级
        group = Group.objects.get(id=2) # 获取学生组
        group.user_set.add(user) #反向, 把用户添加到组里面 注意:反向操作是要注意是否替换反向管理器了

        classes.member.add(user) #正向, 把用户添加到班级里面

        # 6.通过邮件将账号与初始密码发送给学生的邮箱
        # send_email_task(email,username,password,classes.num) # 邮箱,用户名,密码,班级名 # 不是异步
        send_email_task.delay(email,username,password,classes.num) # 异步 调用delay方法表示提交的任务,是一个异步任务的队列当中


        return Response(user_serializer.data)







